AvgPoolingGrad ================= 根据输入梯度对平均池化前的特征图计算反向传播梯度。 .. math:: output_{b, x_h, x_w, c} += \frac{input_{b, y_h, y_w, c}}{\text{window}_h \cdot \text{window}_w} 其中 :math:`(y_h, y_w)` 与 :math:`(x_h, x_w)` 之间满足窗口与步长的映射关系。 输入: - **input** - 反向传播输入梯度张量首地址。 - **output** - 反向传播输出梯度张量首地址。 - **batch** - 批大小。 - **output_h** - 池化输出高度。 - **output_w** - 池化输出宽度。 - **channel** - 通道数。 - **input_w** - 池化输入宽度。 - **input_h** - 池化输入高度。 - **stride_w** - 水平步长。 - **stride_h** - 垂直步长。 - **pad_l** - 左侧填充大小。 - **pad_u** - 上侧填充大小。 - **window_w** - 池化窗口宽度。 - **window_h** - 池化窗口高度。 - **core_mask(int, 可选)** - 核掩码(仅适用于共享存储版本)。 输出: - **output** - 原地累加平均池化反向传播梯度。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持 fp32 数据类型。 - MT7004 支持 fp16、fp32 数据类型。 **共享存储版本:** .. c:function:: void hp_avgpoolinggrad_s(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask) .. c:function:: void fp_avgpoolinggrad_s(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 20 // FT78NE 多核示例 #include int main(void) { const float *input = (const float *)0xA0000000; // DDR 存储 float *output = (float *)0xB0000000; int batch = 16; int output_h = 7; int output_w = 7; int channel = 64; int input_w = 14; int input_h = 14; int stride_w = 2; int stride_h = 2; int pad_l = 0; int pad_u = 0; int window_w = 2; int window_h = 2; int core_mask = 0xff; fp_avgpoolinggrad_s(input, output, batch, output_h, output_w, channel, input_w, input_h, stride_w, stride_h, pad_l, pad_u, window_w, window_h, core_mask); return 0; } **私有存储版本:** .. c:function:: void hp_avgpoolinggrad_p(const half *input, half *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx) .. c:function:: void fp_avgpoolinggrad_p(const float *input, float *output, int batch, int output_h, int output_w, int channel, int input_w, int input_h, int stride_w, int stride_h, int pad_l, int pad_u, int window_w, int window_h, int start_idx, int end_idx) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 21 // MT7004 单核示例 #include int main(void) { const half *input = (const half *)0x10000000; // L2 存储 half *output = (half *)0x10004000; int batch = 4; int output_h = 4; int output_w = 4; int channel = 128; int input_w = 8; int input_h = 8; int stride_w = 2; int stride_h = 2; int pad_l = 0; int pad_u = 0; int window_w = 2; int window_h = 2; int start_idx = 0; int end_idx = batch * output_h * output_w * channel; hp_avgpoolinggrad_p(input, output, batch, output_h, output_w, channel, input_w, input_h, stride_w, stride_h, pad_l, pad_u, window_w, window_h, start_idx, end_idx); return 0; }